<?php

// Debug scopes
//require_once 'debugScopes.php';

class JGLib
{

	public static $VERSION = 20080620;
	
	/*
	 * Debug function
	 */
	
	// Allow debugging message with scope
	public static function debug($value, $message = '', $scope = JGLIB_DEBUG_INFO, &$output = null)
	{
		$result = $value;
		if(((int)DEBUG & $scope) == $scope)
		{
			if(is_null($value))
			{
				$value = "NULL";
			}
			elseif($value === true)
			{
				$value = "TRUE";
			}
			elseif($value === false)
			{
				$value = "FALSE";
			}
			elseif(is_array($value))
			{
				$value = ereg_replace("\n|\t|( +)",' ',print_r($value, true));
			}
			
			$head = 'DEBUG > ';
			if(ereg('%v', $message))
			{
				$message = $head.str_replace('%v', $value, $message);
			}
			elseif(empty($message))
			{
				$message = $head.$value;
			}
			else
			{
				$message = $head.$message.': '.$value;
			}
			
			if(JGLIB_DEBUG_HTML) $message = '<pre class="debug">'.$message.'</pre>';
			$message .= "\n";
			
			if(!is_null($output))
			{
				$output .= $message;
			}
			else
			{
				echo $message;
			}
		}
		return $result;
	}
	
	/**
	 * Retourne les informations d'une date MySQL ou EXIF (pour permettre de la formatter apres)
	 *
	 * @param string $date MySQL ou EXIF
	 * @return array $date array('y', 'm', 'd', 'h', 'n', 's');
	 */
	public static function trDate($date)
	{
		$cpt  = 0;
		$res  = array('y'=>null, 'm'=>null, 'd'=>null, 'h'=>null, 'n'=>null, 's'=>null);
		$date = explode('-', ereg_replace('[^0-9]', '-', $date));
		$info = array('y', 'm', 'd', 'h', 'n', 's');
		foreach($date as $d)
		{
			$res[$info[$cpt++]] = $d;
		}
		return $res;
	}

	/**
	 * Retourne les informations d'une date MySQL ou EXIF (pour permettre de la formatter apres)
	 *
	 * @param string $date MySQL ou EXIF
	 * @return string $d date format français
	 */
	public static function trDateFr($date)
	{
		$dtmp = trDate($date);
		return $dtmp['d'].'/'.$dtmp['m'].'/'.$dtmp['y'].' '.$dtmp['h'].':'.$dtmp['n'].':'.$dtmp['s'];
	}
	
	// Check if an element is foreach-able (array or object and non empty)
	public static function isForeachable($element)
	{
		return (!empty($element) && (is_array($element) || is_object($element)));
	}
	
	// Uncamelize string (thisIsAnExempleOfCamelizedString)
	// return an array with each found word
	public static function unCamelize($str)
	{
		$len       = strlen($str);
		$result    = array();
		$c_result  = 0;
		$result[0] = '';
		$lastWasUp = false;
		for($c = 0; $c < $len; $c++)
		{
			if(ord($str[$c]) >= ord('A') && ord($str[$c]) <= ord('Z'))
			{
				if(!$lastWasUp)
				{
					$c_result++;
					$result[$c_result] = '';
				}
				$lastWasUp = true;
			}
			else
			{
				$lastWasUp = false;
			}
			$result[$c_result] .= $str[$c];
		}

		return $result;
	}
	
	/**
	 * Creer l'apercu d'une image use GD
	 * Fonction qui va creer un apercu de l'item, dans la mesure du possible
	 *
	 * Attention cette fonction est silencieuse sur ses erreurs, pour le debug ajoutez $_D = true; en haut de cette page
	 *
	 * @param int/string $idItem id de l'item concerne ou le chemin de l'image en cas de stand alone
	 * @param int $tailleX taille largeur de destination
	 * @param int $tailleY taille hauteur de destination
	 * @param int $r couleur rouge en arriere plan (0-255)
	 * @param int $v couleur vert en arriere plan (0-255)
	 * @param int $b couleur bleu en arriere plan (0-255)
	 * @param float $ration ratio de redimension (0-1)
	 * @return link $c image resource link or empty if error
	 */
	public static function imageThumbnail($uri, $x=128, $y=128, $strict=false, $ratio=0, $r=255, $v=255, $b=255)
	{
		if(!eregi('^http://', $uri) && @filesize($uri) >= 4*1024*1024)
		{
			JGLib::debug("L'image est trop lourde pour en faire un apercu (> 4Mo)",'%v',11);
			return '';
		}

		// image information
		$infoImage = @getimagesize($uri);
		$xSrc  = $infoImage[0];
		$ySrc  = $infoImage[1];
		$xDest = $x;
		$yDest = $y;

		// if ration is specified, get the new size
		if($ratio != 0)
		{
			$xDest = floor($xSrc * $ratio);
			$yDest = floor($ySrc * $ratio);
		}

		// new image source
		switch($infoImage[2])
		{
			case 1: 
				$imgSrc = @imagecreatefromgif($uri);
				break;
			case 2:
				$imgSrc = @imagecreatefromjpeg($uri);
				break;
			case 3: 
				$imgSrc = @imagecreatefrompng($uri);
				break;
			default : 
				JGLib::debug("Le type d'image n'est pas pris en charge",'%v', 11);
				return '';
		}

		// image position in the thumbnail (strict mode only)
		if($xSrc >= $ySrc)
		{
			$x01 = $xDest;
			$y01 = floor($xDest * $ySrc / $xSrc) + 1;
			$x01Pos = floor(($xDest - $x01) / 2);
			$y01Pos = floor(($yDest - $y01) / 2);
		}
		else
		{
			$y01 = $yDest;
			$x01 = floor($yDest * $xSrc / $ySrc) + 1;
			$x01Pos = floor(($xDest - $x01) / 2);
			$y01Pos = floor(($yDest - $y01) / 2);
		}
		
		if($strict === false)
		{
			$xDest  = $x01;
			$yDest  = $y01;
			$x01Pos = 0;
			$y01Pos = 0;
		}

		// thumbnail resource
		if(function_exists('imagecreatetruecolor'))
		{
			$imageDest = @imagecreatetruecolor($xDest, $yDest);
		}
		elseif(function_exists('imagecreate'))
		{
			$imageDest = @imagecreate($xDest, $yDest);
		}
		else
		{
			JGLib::debug("Les fonctions imagecreate* ne sont pas disponibles, verifiez que GD est bien installe","%v",11);
			return '';
		}

		// background color
		$bg = @imagecolorallocate($imageDest, $r, $v, $b);
		@imagefill($imageDest, 0, 0, $bg);

		// copy/resize
		if(!@imagecopyresized($imageDest, $imgSrc, $x01Pos, $y01Pos, 0, 0, $x01, $y01, $xSrc, $ySrc))
		{
			JGLib::debug("Impossible de faire la copie/redimension",'%v',11);
			return '';
		}

		return $imageDest;
	}
	
	// Redirect is like header Location with check
	public static function redirect($location)
	{
		if(headers_sent())
		{
			JGLib::debug($location, 'Redirect failled: <a href="%v">%v</a>');
		}
		else
		{
			header('Location: '.$location);
		}
		exit;
	}
	
}

